{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "# How to use Keras"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "Keras was designed as a high-level or meta API to accelerate the iterative workflow when designing and training deep neural networks with computational backends like TensorFlow, Theano, or CNTK. It has been integrated into TensorFlow in 2017 and is set to become the principal TensorFlow interface with the 2.0 release. You can also combine code from both libraries to leverage Keras’ high-level abstractions as well as customized TensorFlow graph operations."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "Please follow the installations instructions in `Installation Guide.md` in the root folder."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "## Imports \u0026 Settings "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:16.736286Z",
          "start_time": "2019-01-11T01:07:16.731868Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "import warnings\n",
        "warnings.filterwarnings(\u0027ignore\u0027)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:17.355942Z",
          "start_time": "2019-01-11T01:07:16.742159Z"
        },
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Using Theano backend.\n"
          ]
        }
      ],
      "source": [
        "%matplotlib inline\n",
        "from copy import deepcopy\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import sklearn\n",
        "from sklearn.datasets import make_circles # To generate the dataset\n",
        "from keras.models import Sequential\n",
        "from keras.layers import Dense, Activation\n",
        "from keras import optimizers\n",
        "from keras.callbacks import TensorBoard\n",
        "\n",
        "import matplotlib\n",
        "import matplotlib.pyplot as plt\n",
        "from matplotlib.colors import ListedColormap\n",
        "from mpl_toolkits.mplot3d import Axes3D  # 3D plots\n",
        "\n",
        "import seaborn as sns"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:17.360245Z",
          "start_time": "2019-01-11T01:07:17.357187Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "# plotting style\n",
        "sns.set_style(\u0027darkgrid\u0027)\n",
        "# for reproducibility\n",
        "np.random.seed(seed\u003d42)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "## Input Data"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "### Generate random data"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "The target `y` represents two classes generated by two circular distribution that are not linearly separable because class 0 surrounds class 1."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:17.371132Z",
          "start_time": "2019-01-11T01:07:17.361616Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "# dataset params\n",
        "N \u003d 50000\n",
        "factor \u003d 0.1\n",
        "noise \u003d 0.1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:17.389633Z",
          "start_time": "2019-01-11T01:07:17.372774Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "# generate data\n",
        "X, y \u003d make_circles(\n",
        "    n_samples\u003dN,\n",
        "    shuffle\u003dTrue,\n",
        "    factor\u003dfactor,\n",
        "    noise\u003dnoise)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:17.412374Z",
          "start_time": "2019-01-11T01:07:17.397474Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "# define outcome matrix\n",
        "Y \u003d np.zeros((N, 2))\n",
        "for c in [0, 1]:\n",
        "    Y[y \u003d\u003d c, c] \u003d 1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:17.426978Z",
          "start_time": "2019-01-11T01:07:17.418696Z"
        },
        "pycharm": {}
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "\u0027Shape of: X: (50000, 2) | Y: (50000, 2) | y: (50000,)\u0027"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "f\u0027Shape of: X: {X.shape} | Y: {Y.shape} | y: {y.shape}\u0027"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "### Visualize Data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:18.182800Z",
          "start_time": "2019-01-11T01:07:17.430021Z"
        },
        "pycharm": {}
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "\u003cFigure size 432x288 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "sns.scatterplot(x\u003dX[:, 0], \n",
        "                y\u003dX[:, 1], \n",
        "                hue\u003dy,\n",
        "               style\u003dy,\n",
        "               markers\u003d[\u0027_\u0027, \u0027+\u0027]);"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "## Build Keras Model"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "Keras supports both a slightly simpler Sequential and more flexible Functional API. We will introduce the former at this point and use the Functional API in more complex examples in the following chapters.\n",
        "\n",
        "To create a model, we just need to instantiate a Sequential object and provide a list with the sequence of standard layers and their configurations, including the number of units, type of activation function, or name. "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "### Define Architecture"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:18.245163Z",
          "start_time": "2019-01-11T01:07:18.183793Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "model \u003d Sequential([\n",
        "    Dense(units\u003d3, input_shape\u003d(2,), name\u003d\u0027hidden\u0027),\n",
        "    Activation(\u0027sigmoid\u0027, name\u003d\u0027logistic\u0027),\n",
        "    Dense(2, name\u003d\u0027output\u0027),\n",
        "    Activation(\u0027softmax\u0027, name\u003d\u0027softmax\u0027),\n",
        "])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "The first hidden layer needs information about the number of features in the matrix it receives from the input layer via the input_shape argument. In our simple case, these are just two. Keras infers the number of rows it needs to process during training, through the batch_size argument that we will pass to the fit method below. \n",
        "\n",
        "Keras infers the sizes of the inputs received by other layers from the previous layer’s units argument."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "Keras provides numerous standard building blocks, including recurrent and convolutional layers, various options for regularization, a range of loss functions and optimizers, and also preprocessing, visualization and logging (see documentation on GitHub for reference). It is also extensible.\n",
        "\n",
        "The model’s summary method produces a concise description of the network architecture, including a list of the layer types and shapes, and the number of parameters:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:18.249379Z",
          "start_time": "2019-01-11T01:07:18.246070Z"
        },
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n",
            "hidden (Dense)               (None, 3)                 9         \n",
            "_________________________________________________________________\n",
            "logistic (Activation)        (None, 3)                 0         \n",
            "_________________________________________________________________\n",
            "output (Dense)               (None, 2)                 8         \n",
            "_________________________________________________________________\n",
            "softmax (Activation)         (None, 2)                 0         \n",
            "\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n",
            "Total params: 17\n",
            "Trainable params: 17\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ]
        }
      ],
      "source": "model.summary()"
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "## Compile Model"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "Next, we compile the Sequential model to configure the learning process. To this end, we define the optimizer, the loss function, and one or several performance metrics to monitor during training:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:18.278050Z",
          "start_time": "2019-01-11T01:07:18.251293Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "model.compile(optimizer\u003d\u0027rmsprop\u0027,\n",
        "              loss\u003d\u0027binary_crossentropy\u0027,\n",
        "              metrics\u003d[\u0027accuracy\u0027])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "## Tensorboard Callback"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "Keras uses callbacks to enable certain functionality during training, such as logging information for interactive display in TensorBoard (see next section):"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:20.840619Z",
          "start_time": "2019-01-11T01:07:18.278933Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "tb_callback \u003d TensorBoard(log_dir\u003d\u0027./tensorboard\u0027, \n",
        "                          histogram_freq\u003d1, \n",
        "                          write_graph\u003dTrue, \n",
        "                          write_images\u003dTrue)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "## Train Model"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "To train the model, we call its fit method and pass several parameters in addition to the training data:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:28.046150Z",
          "start_time": "2019-01-11T01:07:20.841743Z"
        },
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Train on 40000 samples, validate on 10000 samples\n",
            "Epoch 1/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 5us/step - loss: 0.7062 - acc: 0.4973 - val_loss: 0.6921 - val_acc: 0.5785\n",
            "Epoch 2/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.6915 - acc: 0.6147 - val_loss: 0.6900 - val_acc: 0.3484\n",
            "Epoch 3/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.6886 - acc: 0.5819 - val_loss: 0.6858 - val_acc: 0.7033\n",
            "Epoch 4/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.6815 - acc: 0.6847 - val_loss: 0.6757 - val_acc: 0.8074\n",
            "Epoch 5/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.6660 - acc: 0.7901 - val_loss: 0.6544 - val_acc: 0.8581\n",
            "Epoch 6/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.6385 - acc: 0.8732 - val_loss: 0.6207 - val_acc: 0.8806\n",
            "Epoch 7/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.5992 - acc: 0.8884 - val_loss: 0.5772 - val_acc: 0.8871\n",
            "Epoch 8/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.5516 - acc: 0.8950 - val_loss: 0.5277 - val_acc: 0.8896\n",
            "Epoch 9/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.5004 - acc: 0.8985 - val_loss: 0.4773 - val_acc: 0.8929\n",
            "Epoch 10/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.4503 - acc: 0.9007 - val_loss: 0.4286 - val_acc: 0.8950\n",
            "Epoch 11/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.4025 - acc: 0.9032 - val_loss: 0.3831 - val_acc: 0.8967\n",
            "Epoch 12/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.3582 - acc: 0.9068 - val_loss: 0.3408 - val_acc: 0.9014\n",
            "Epoch 13/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.3163 - acc: 0.9106 - val_loss: 0.2996 - val_acc: 0.9088\n",
            "Epoch 14/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.2751 - acc: 0.9177 - val_loss: 0.2583 - val_acc: 0.9178\n",
            "Epoch 15/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.2340 - acc: 0.9284 - val_loss: 0.2174 - val_acc: 0.9311\n",
            "Epoch 16/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.1949 - acc: 0.9488 - val_loss: 0.1798 - val_acc: 0.9546\n",
            "Epoch 17/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.1597 - acc: 0.9685 - val_loss: 0.1462 - val_acc: 0.9724\n",
            "Epoch 18/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.1286 - acc: 0.9893 - val_loss: 0.1170 - val_acc: 0.9972\n",
            "Epoch 19/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.1024 - acc: 0.9990 - val_loss: 0.0928 - val_acc: 0.9995\n",
            "Epoch 20/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.0803 - acc: 0.9997 - val_loss: 0.0720 - val_acc: 0.9997\n",
            "Epoch 21/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.0620 - acc: 0.9998 - val_loss: 0.0556 - val_acc: 0.9998\n",
            "Epoch 22/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.0474 - acc: 0.9999 - val_loss: 0.0421 - val_acc: 0.9998\n",
            "Epoch 23/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.0358 - acc: 0.9999 - val_loss: 0.0318 - val_acc: 1.0000\n",
            "Epoch 24/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.0270 - acc: 0.9999 - val_loss: 0.0240 - val_acc: 1.0000\n",
            "Epoch 25/25\n",
            "40000/40000 [\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d] - 0s 4us/step - loss: 0.0204 - acc: 0.9999 - val_loss: 0.0182 - val_acc: 1.0000\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "\u003ckeras.callbacks.History at 0x7f1613583fd0\u003e"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "model.fit(X, \n",
        "          Y, \n",
        "          epochs\u003d25,\n",
        "          validation_split\u003d.2,\n",
        "          batch_size\u003d128, \n",
        "          verbose\u003d1, \n",
        "          callbacks\u003d[tb_callback])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "## Get Weights"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:28.051791Z",
          "start_time": "2019-01-11T01:07:28.047123Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "hidden \u003d model.get_layer(\u0027hidden\u0027).get_weights()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:28.063994Z",
          "start_time": "2019-01-11T01:07:28.053506Z"
        },
        "pycharm": {}
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[(2, 3), (3,)]"
            ]
          },
          "execution_count": 15,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "[t.shape for t in hidden]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "## Plot Decision Boundary"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "The visualization of the decision boundary resembles the result from the manual network implementation. The training with Keras runs a multiple faster, though."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:28.071431Z",
          "start_time": "2019-01-11T01:07:28.064872Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "n_vals \u003d 200\n",
        "x1 \u003d np.linspace(-1.5, 1.5, num\u003dn_vals)\n",
        "x2 \u003d np.linspace(-1.5, 1.5, num\u003dn_vals)\n",
        "xx, yy \u003d np.meshgrid(x1, x2)  # create the grid"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:28.081951Z",
          "start_time": "2019-01-11T01:07:28.072296Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "X_ \u003d np.array([xx.ravel(), yy.ravel()]).T"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:28.207093Z",
          "start_time": "2019-01-11T01:07:28.083027Z"
        },
        "pycharm": {}
      },
      "outputs": [],
      "source": [
        "y_hat \u003d np.argmax(model.predict(X_), axis\u003d1)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-01-11T01:07:28.982472Z",
          "start_time": "2019-01-11T01:07:28.208792Z"
        },
        "pycharm": {}
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEVCAYAAAD3pQL8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsvXl0HOWZ7/95q6pbakmWZDngDcsxYLMZxzgQCGPCEhJsDGHIRoBrksBcknC55AeHDE4mkzNzLwmQSyCTZMxcCMxkuBAg2wTHgRBPAMdDMFsMXoJtjPFuy7ZkLa2Weqn390ctXdVd1YvU6q6W63OOj6VeqqvUVfW8z/Z9hJRSEhISEhISUiJKrXcgJCQkJKS+CA1HSEhISEhZhIYjJCQkJKQsQsMREhISElIWoeEICQkJCSmL0HCEhISEhJSFVusdCAnxY/fu3XzsYx9jzpw5AOi6TnNzM9dddx2XXnrpiLf73//7f+eOO+7gxBNP9Hx+/fr1PPTQQ/zgBz8Y8Wc4ueiii4hEIjQ2NqLrOrquc91113HVVVdVZPuF6O7u5sMf/jCbN28e888KOXoIDUdIoGlsbOTXv/61/fuePXv4whe+gKqqXHLJJSPa5kMPPVTw+dNPP71iRsPi3nvv5fTTTwdg3759XHLJJXzkIx9h6tSpFf2ckJBqEIaqQuqK6dOnc8stt/Dwww8DkEwm+c53vsOVV17JJz7xCZYtW8bAwAAA27dvZ+nSpSxZsoTLL7+c3/72t4DhAaxfv554PM4tt9zCFVdcwZVXXsk3v/lNdF1n7dq1XHbZZQD09/dz++23c9lll3H55Zfz3e9+l3Q6DRgG5oc//CGf+9znuOiii3j88cdLOobe3l5isRhNTU0AvPbaa3z2s5/l8ssv55Of/CSrV68G4Je//CVf+tKX7Pc5f1+2bBl33nknS5cu5WMf+xg333wz8XgcgOeee47FixfzyU9+ku9///v2+wcHB/nbv/1brrrqKi655BI++clP8u677wKwdOlSbr75Zi699FJ+9KMfsWDBAvr7+wGQUnLJJZfw9ttvl/t1hYxTQsMRUnecfPLJbNmyBYAHH3wQVVX55S9/ydNPP82xxx7LvffeC8Btt93GokWLWLlyJQ8++CD33XefbVQAfv/73xOPx/n1r3/Nz3/+cwB27drl+qw777yT9vZ2VqxYwS9+8Qs2b97MI488AhhGa+LEiTzxxBP84Ac/4K677mJ4eNhzn2+//XauuOIKFi1axJVXXsnnPvc52tra6Onp4ZZbbuHv/u7vWLFiBffccw9f+9rX8vbDiw0bNvDwww/z29/+lj179vDss89y6NAhvvGNb/DDH/6QX/7yl0yfPt1+/erVq2ltbeXJJ5/kd7/7HXPnzuWxxx6zn29tbeW3v/0tN998M+eccw5PP/00AC+//DLt7e2cfPLJRfcp5OggDFWF1B1CCBobGwF44YUX6O/v56WXXgIglUoxadIkjhw5wttvv81nPvMZAKZOncqqVatc2/ngBz/I/fffz9KlSzn33HP5/Oc/z8yZM9m/f7/9mtWrV/PTn/4UIQTRaJTPfe5z/OQnP+HGG28E4KMf/SgAp512GslkksHBQRoaGvL22Rmq2rVrF1/4wheYPXs2EyZMoLOzkw984AMAzJ49mwULFvDKK68ghCj4dzjvvPOIRqMAzJkzh97eXl5//XXmzJlj52+uuuoq7rvvPgAWLVrEjBkzePTRR9mxYwevvPIKZ5xxhr29M8880/752muv5f/8n//Dtddey5NPPsnVV19dcF9Cji5CwxFSd6xfv96VMP/GN77B+eefD0A8Hmd4eBhNM05t58333XffZdq0afbvM2bM4Pe//z1r167l5Zdf5otf/CL/63/9L5qbm+3X6Lru2oau63aoCrCNhPWaUqTfZsyYwUUXXcSrr77K+eefn2cgpJSk02mi0ahre6lUyvU6y3han2+91vke6+8A8Pjjj/PUU09x7bXXcvnll9Pe3s7u3bvt563QGcC5555LIpHgT3/6E6+99hr33HNP0eMKOXoIQ1UhdcX27dtZvnw5119/PQALFy7kscceI5lMous6f//3f899991HS0sLp512Gv/xH/8BGAnpq6++2o7bg3Ej/frXv87ChQv52te+xsKFC9m0aZPr8xYuXMj/+3//DyklyWSSp556inPPPXdUxzA4OMirr77KvHnzmD9/Pu+++y5vvfUWAFu3buXVV1/lQx/6EB0dHWzdupXh4WFSqRS/+93vim77rLPO4p133rHzEb/85S/t59asWcOVV17JZz7zGWbNmsUf/vAHMpmM53aEEFxzzTX83d/9HZdddpmnFxVy9BJ6HCGBZmhoiCuuuAIARVFo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\u003d\u003d\n",
            "text/plain": [
              "\u003cFigure size 432x288 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Create a color map to show the classification colors of each grid point\n",
        "cmap \u003d ListedColormap([sns.xkcd_rgb[\"pale red\"],\n",
        "                       sns.xkcd_rgb[\"denim blue\"]])\n",
        "\n",
        "# Plot the classification plane with decision boundary and input samples\n",
        "plt.contourf(xx, yy, y_hat.reshape(n_vals, -1), cmap\u003dcmap, alpha\u003d.25)\n",
        "\n",
        "# Plot both classes on the x1, x2 plane\n",
        "data \u003d pd.DataFrame(X, columns\u003d[\u0027$x_1$\u0027, \u0027$x_2$\u0027]).assign(Class\u003dpd.Series(y).map({0:\u0027negative\u0027, 1:\u0027positive\u0027}))\n",
        "sns.scatterplot(x\u003d\u0027$x_1$\u0027, y\u003d\u0027$x_2$\u0027, hue\u003d\u0027Class\u0027, data\u003ddata, style\u003dy, markers\u003d[\u0027_\u0027, \u0027+\u0027], legend\u003dFalse)\n",
        "plt.title(\u0027Decision Boundary\u0027);"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.8"
    },
    "toc": {
      "base_numbering": 1,
      "nav_menu": {},
      "number_sections": true,
      "sideBar": true,
      "skip_h1_title": true,
      "title_cell": "Table of Contents",
      "title_sidebar": "Contents",
      "toc_cell": false,
      "toc_position": {
        "height": "calc(100% - 180px)",
        "left": "10px",
        "top": "150px",
        "width": "254px"
      },
      "toc_section_display": true,
      "toc_window_display": true
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}